#!/bin/bash

# SSL 错误综合修复脚本
# 解决 ERR_SSL_PROTOCOL_ERROR 和相关问题

set -e

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 配置变量
APP_NAME="xy-user-system"
APP_DIR="/opt/xy-user-pro"
DOMAIN="wmxy.1314du.com"
PORT=3000

echo -e "${BLUE}=== SSL 错误综合修复脚本 ===${NC}"
echo -e "${BLUE}域名: $DOMAIN${NC}"
echo -e "${BLUE}应用端口: $PORT${NC}"
echo ""

# 检查是否为 root 用户
if [ "$EUID" -ne 0 ]; then
    echo -e "${RED}错误: 请使用 root 权限运行此脚本${NC}"
    exit 1
fi

# 函数：打印步骤
print_step() {
    echo -e "${YELLOW}[步骤] $1${NC}"
}

# 函数：打印成功
print_success() {
    echo -e "${GREEN}✅ $1${NC}"
}

# 函数：打印错误
print_error() {
    echo -e "${RED}❌ $1${NC}"
}

# 函数：打印警告
print_warning() {
    echo -e "${YELLOW}⚠️  $1${NC}"
}

# 步骤 1: 检查和修复 SSL 证书配置
print_step "1. 检查和修复 SSL 证书配置"

# 创建 SSL 目录
mkdir -p /etc/nginx/ssl

# 检查 Let's Encrypt 证书
if [ -f "/etc/letsencrypt/live/$DOMAIN/fullchain.pem" ]; then
    print_success "发现 Let's Encrypt 证书"
    
    # 创建符号链接
    ln -sf /etc/letsencrypt/live/$DOMAIN/fullchain.pem /etc/nginx/ssl/your-domain.crt
    ln -sf /etc/letsencrypt/live/$DOMAIN/privkey.pem /etc/nginx/ssl/your-domain.key
    
    print_success "证书链接创建完成"
else
    print_error "未找到 Let's Encrypt 证书"
    echo "请运行以下命令获取证书："
    echo "certbot --nginx -d $DOMAIN"
    exit 1
fi

# 生成 DH 参数文件
if [ ! -f "/etc/nginx/ssl/dhparam.pem" ]; then
    print_step "生成 DH 参数文件（这可能需要几分钟）"
    openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048
    print_success "DH 参数文件生成完成"
else
    print_success "DH 参数文件已存在"
fi

# 设置正确的权限
chmod 644 /etc/nginx/ssl/*.crt 2>/dev/null || true
chmod 600 /etc/nginx/ssl/*.key 2>/dev/null || true
chmod 644 /etc/nginx/ssl/dhparam.pem 2>/dev/null || true
chown -R root:root /etc/nginx/ssl/
print_success "SSL 文件权限设置完成"

# 步骤 2: 检查和修复应用服务
print_step "2. 检查和修复应用服务"

# 检查应用目录
if [ ! -d "$APP_DIR" ]; then
    print_error "应用目录 $APP_DIR 不存在"
    exit 1
fi

cd "$APP_DIR"

# 检查应用构建文件
if [ ! -f "dist/main.js" ]; then
    print_warning "应用未构建，开始构建..."
    npm run build
    print_success "应用构建完成"
fi

# 检查端口占用
if netstat -tlnp | grep ":$PORT " > /dev/null; then
    PID=$(netstat -tlnp | grep ":$PORT " | awk '{print $7}' | cut -d'/' -f1)
    print_warning "端口 $PORT 被进程 $PID 占用，停止旧进程"
    kill $PID 2>/dev/null || true
    sleep 3
fi

# 创建或更新 systemd 服务
cat > /etc/systemd/system/${APP_NAME}.service << EOF
[Unit]
Description=XY User System Application
After=network.target mysql.service
Wants=mysql.service

[Service]
Type=simple
User=root
WorkingDirectory=$APP_DIR
EnvironmentFile=-$APP_DIR/.env
ExecStart=/usr/bin/node dist/main.js
Restart=always
RestartSec=10
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=$APP_NAME

# 环境变量
Environment=NODE_ENV=production
Environment=PORT=$PORT

[Install]
WantedBy=multi-user.target
EOF

# 重新加载并启动服务
systemctl daemon-reload
systemctl enable $APP_NAME
systemctl restart $APP_NAME

# 等待服务启动
sleep 5

# 检查应用服务状态
if systemctl is-active --quiet $APP_NAME; then
    print_success "应用服务启动成功"
else
    print_error "应用服务启动失败"
    echo "查看日志：journalctl -u $APP_NAME -n 20"
    exit 1
fi

# 步骤 3: 测试和重启 Nginx
print_step "3. 测试和重启 Nginx"

# 测试 Nginx 配置
if nginx -t; then
    print_success "Nginx 配置测试通过"
else
    print_error "Nginx 配置测试失败"
    exit 1
fi

# 重启 Nginx
systemctl restart nginx

if systemctl is-active --quiet nginx; then
    print_success "Nginx 重启成功"
else
    print_error "Nginx 重启失败"
    exit 1
fi

# 步骤 4: 连接测试
print_step "4. 进行连接测试"

# 测试应用连接
echo "测试应用连接..."
if curl -f http://localhost:$PORT/health > /dev/null 2>&1; then
    print_success "应用健康检查通过"
else
    print_warning "应用健康检查失败，但服务可能仍在启动中"
fi

# 测试 HTTPS 连接
echo "测试 HTTPS 连接..."
if curl -f -k https://localhost/health > /dev/null 2>&1; then
    print_success "HTTPS 连接测试通过"
else
    print_warning "HTTPS 连接测试失败"
fi

# 步骤 5: 显示状态和建议
print_step "5. 系统状态检查"

echo ""
echo -e "${BLUE}=== 服务状态 ===${NC}"
echo "Nginx 状态:"
systemctl status nginx --no-pager -l | head -5
echo ""
echo "应用服务状态:"
systemctl status $APP_NAME --no-pager -l | head -5
echo ""

echo -e "${BLUE}=== 监控命令 ===${NC}"
echo "查看 Nginx 错误日志: tail -f /var/log/nginx/error.log"
echo "查看应用日志: journalctl -u $APP_NAME -f"
echo "检查端口占用: netstat -tlnp | grep :$PORT"
echo "测试 SSL: openssl s_client -connect $DOMAIN:443 -servername $DOMAIN"
echo ""

echo -e "${BLUE}=== 证书信息 ===${NC}"
if command -v certbot &> /dev/null; then
    certbot certificates | grep -A 5 $DOMAIN || echo "未找到证书信息"
fi

echo ""
print_success "SSL 错误修复脚本执行完成！"
echo -e "${YELLOW}建议：${NC}"
echo "1. 监控错误日志确认问题是否解决"
echo "2. 如果问题持续，检查防火墙和网络配置"
echo "3. 考虑设置证书自动续期监控"
echo "4. 定期检查服务器资源使用情况"